HJS

any 타입을 사용하면 안되는 이유와 대안

TypeScript에서 any 타입을 사용하면 타입 검사가 무력화되어 TypeScript를 사용하는 장점이 사라집니다.

1️⃣ any의 문제점

let value: any = "Hello";
value = 42;   // ✅ 타입 검사 통과 (버그 가능성 증가)
value = true; // ✅ 타입 검사 통과 (의도치 않은 값이 할당될 수 있음)



2️⃣ any를 사용하는 경우

🔹 개발 단계에서 임시로 값을 지정할 때

타입을 미처 확정하지 못한 경우, 빠르게 개발하기 위해 any를 사용합니다.

let temp: any; // 나중에 올바른 타입을 지정할 예정
temp = "test";
temp = 123;

🔹 어떤 값을 받아올지 또는 넘겨줄지 정할 수 없을 때

외부 라이브러리에서 반환하는 값이 다양한 타입일 경우 any를 사용할 수 있습니다.

function handleData(data: any) {
    console.log(data);
}

🔹값을 예측할 수 없을 때 암묵적으로 사용

JSON 파싱 결과처럼 구조를 미리 알 수 없는 데이터를 다룰 때 any를 사용하기도 합니다.

const jsonData: any = JSON.parse('{"name": "Alice", "age": 25}');

하지만, 가능한 아래 대체 방법을 사용하는 것이 좋다.




3️⃣ any를 대체할 수 있는 방법

🔹 unknown 타입 사용 (보다 안전한 대체제)

unknownany와 비슷하지만, 타입 검사를 강제하므로 안전합니다.

let value: unknown;
value = "Hello";
value = 42;

// 타입을 확정해야만 사용 가능
if (typeof value === "string") {
  console.log(value.toUpperCase()); // ✅ 정상 동작
}

🔹 union type 사용 (명확한 타입 지정)

예상 가능한 타입을 명확하게 지정하면 any를 피할 수 있습니다.

let value: string | number;
value = "Hello"; // ✅ 가능
value = 42;      // ✅ 가능
value = true;    // ❌ 오류 발생 (string | number가 아님)

🔹 제네릭(Generic) 사용 (유연한 타입 적용)

제네릭을 활용하면 특정 타입을 지정할 수 있어 any보다 안전합니다.

function identity<T>(arg: T): T {
  return arg;
}

let output1 = identity<string>("Hello");
let output2 = identity<number>(42);



🎯 결론